﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using Web.Framework.Svc;
using System.IO;
using PlanProd.Services;


namespace PlanProd.SincDesviosSanJuan
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
                PrintUsage();
            else
            {
                try
                {

                    ProgParam progParams = new ProgParam();
                    progParams.ParseArgs(args);

                    if (progParams.PrintUsage)
                    {
                        PrintUsage();
                    }
                    else
                    {
                        switch (progParams.Modo)
                        {
                            case "-t":
                                ProcesarParaFechaDeHoy(progParams.Destino);
                                break;

                            case "-d":
                                if (args.Length < 2)
                                    PrintUsage();
                                else
                                {
                                    ProcesarParaFecha(progParams.FechaDesde, progParams.Destino);
                                }
                                break;

                            case "-r":
                                if (args.Length < 3)
                                    PrintUsage();
                                else
                                {
                                    ProcesarParaFechas(progParams.FechaDesde, progParams.FechaDesde, progParams.Destino);
                                }
                                break;
                        }
                    }

                    Log("Fin del Proceso");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Log(ex.Message);
                }
            }
        }

        public static void ProcesarParaFechaDeHoy(string nombreDestino)
        {
            ProcesarParaFecha(DateTime.Now, nombreDestino);
        }

        public static void ProcesarParaFecha(DateTime fechaProceso, string nombreDestino)
        {
            IncorporacionDeDesviosProcess process = new IncorporacionDeDesviosProcess();
            process.NombrePlan = GetNombrePlan();    
            process.NombreDestinoSap = nombreDestino;
            LoadLogFile(fechaProceso);
            process.OnNotify += new IncorporacionDeDesviosProcess.MensajeNotificacion(process_OnNotify);
            process.IncorporarDesvios(fechaProceso, GetServiceOptions());
        }

        public static void ProcesarParaFechas(DateTime desde, DateTime hasta, string nombreDestino)
        {
            DateTime current = desde;
            while (current.Date <= hasta.Date)
            {
                ProcesarParaFecha(current, nombreDestino);
                current = current.Date.AddDays(1);
            }
        }

        private static void process_OnNotify(string mensaje, IncorporacionDeDesviosProcess.TipoMensajeNotificacion tipoNotificacion)
        {
            Log(mensaje);
        }

        private static void Log(string message)
        {
            if (!String.IsNullOrEmpty(LogFilePath))
            {
                using (StreamWriter writer = File.AppendText(LogFilePath))
                {
                    writer.WriteLine(message);
                    writer.Close();
                }
            }
        }
        
        private static string LogFilePath = string.Empty;

        private static void LoadLogFile(DateTime fechaLog)
        {
            string filePath = ConfigurationManager.AppSettings["LogFilePath"];
            if (!String.IsNullOrEmpty(filePath))
            {
                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }

                // Creo archivo para logear
                filePath = Path.Combine(filePath, fechaLog.ToString("yyyyMMdd"));

                int i = 1;
                string original = filePath;
                while (File.Exists(filePath))
                {
                    filePath = original + "_" + i.ToString();
                    i++;
                }

                LogFilePath = filePath;
            }
        }
        

        private static ServiceOptions GetServiceOptions()
        {
            ServiceOptions options = new ServiceOptions();
            options.CompanyId = Convert.ToInt32(ConfigurationManager.AppSettings["CompanyId"]);
            options.UserName = "Proceso Desvios San Juan";
            return options;
        }

        private static string GetNombrePlan()
        {
            return ConfigurationManager.AppSettings["NombrePlan"];            
        }

        private static void PrintUsage()
        {
            Console.WriteLine("Los parametros del programa son: ");
            Console.WriteLine("-t para procesar la fecha de hoy ");
            Console.WriteLine("-d yyyyMMdd para procesar en una fecha");
            Console.WriteLine("-r yyyyMMdd yyyyMMdd para procesar en un rango desde-hasta incluye todas las fechas");
            Console.WriteLine("-f DESTINO para procesar solo el destino indicado");
            Console.WriteLine("ej: -t -f brasil");                        
        }
    }
}
